package agent

import (
	"fmt"
	"strings"

	"github.com/dean2027/aish/pkg/tools"
	"github.com/sashabaranov/go-openai"
)

const (
	MaxIterations           = 50     // 最大推理-行动循环次数
	MaxMessageHistory       = 100    // 最大消息历史数量
	DefaultCommandTimeout   = 60 * 5 // 默认命令执行超时时间（秒）
	DefaultReasoningTimeout = 60     // 默认推理超时时间（秒）
)

// AgentConfig 智能体配置结构
type AgentConfig struct {
	APIKey           string // OpenAI API密钥
	BaseURL          string // API基础URL
	Model            string // 使用的AI模型
	SerpApiKey       string // Serpapi 密钥
	MaxIterations    int    // 最大循环次数
	MaxHistory       int    // 最大历史记录数量
	CommandTimeout   int    // 命令执行超时时间
	ReasoningTimeout int    // 推理超时时间
}

// ReActAgent 表示ReAct智能体
type ReActAgent struct {
	client           *openai.Client        // OpenAI API客户端
	model            string                // 使用的AI模型名称
	tools            map[string]tools.Tool // 可用工具的映射表
	maxIterations    int                   // 最大循环次数
	currentIteration int                   // 当前循环次数
	reasoningTimeout int                   // AI推理超时时间(秒)
}

// NewReActAgent 创建一个新的ReAct智能体实例（保持向后兼容）
func NewReActAgent(apiKey, baseURL, model string) *ReActAgent {
	config := AgentConfig{
		APIKey:           apiKey,
		BaseURL:          baseURL,
		Model:            model,
		MaxIterations:    MaxIterations,
		MaxHistory:       10,
		CommandTimeout:   DefaultCommandTimeout,
		ReasoningTimeout: DefaultReasoningTimeout,
	}
	return NewReActAgentWithConfig(config)
}

// NewReActAgentWithConfig 使用配置结构创建智能体
func NewReActAgentWithConfig(config AgentConfig) *ReActAgent {
	openaiConfig := openai.DefaultConfig(config.APIKey)
	if config.BaseURL != "" {
		openaiConfig.BaseURL = config.BaseURL
	}

	client := openai.NewClientWithConfig(openaiConfig)

	agent := &ReActAgent{
		client:           client,
		model:            config.Model,
		tools:            make(map[string]tools.Tool),
		maxIterations:    config.MaxIterations,
		currentIteration: 0,
		reasoningTimeout: config.ReasoningTimeout,
	}

	// 使用配置创建工具
	agent.RegisterTool(tools.NewCommandExecutorWithTimeout(config.CommandTimeout))
	agent.RegisterTool(tools.NewFileReader())
	agent.RegisterTool(tools.NewFileWriter())
	agent.RegisterTool(tools.NewWebSearchWithKey(config.SerpApiKey))
	return agent
}

// RegisterTool 向智能体注册一个新工具
func (ra *ReActAgent) RegisterTool(tool tools.Tool) {
	ra.tools[tool.Name()] = tool
}

// GetToolsDescription 获取所有已注册工具的描述信息
func (ra *ReActAgent) GetToolsDescription() string {
	var descriptions []string
	for _, tool := range ra.tools {
		descriptions = append(descriptions, fmt.Sprintf("- %s: %s", tool.Name(), tool.Description()))
	}
	return strings.Join(descriptions, "\n")
}

// GetTools 返回所有注册的工具
func (ra *ReActAgent) GetTools() map[string]tools.Tool {
	return ra.tools
}

// GetClient 返回OpenAI客户端
func (ra *ReActAgent) GetClient() *openai.Client {
	return ra.client
}

// GetModel 返回使用的模型名称
func (ra *ReActAgent) GetModel() string {
	return ra.model
}

// GetMaxIterations 返回最大循环次数
func (ra *ReActAgent) GetMaxIterations() int {
	return ra.maxIterations
}

// GetCurrentIteration 返回当前循环次数
func (ra *ReActAgent) GetCurrentIteration() int {
	return ra.currentIteration
}

// IncrementIteration 增加循环计数
func (ra *ReActAgent) IncrementIteration() {
	ra.currentIteration++
}

// ResetIteration 重置循环计数
func (ra *ReActAgent) ResetIteration() {
	ra.currentIteration = 0
}

// ParseReActResponse 解析ReAct响应
func (ra *ReActAgent) ParseReActResponse(content string) (map[string]interface{}, error) {
	extractor := NewJSONExtractor()
	return extractor.ExtractJSON(content)
}
